import 'dart:collection';

// 页面类
class Page {
  int pageIndex = 0; //页码
  String chapterName = ""; //章节名
  int chapterIndex = 0; //章节索引
  String pageContent = ""; //页面内容
  Page(this.pageIndex, this.chapterName, this.chapterIndex, this.pageContent);
  @override
  String toString() {
    return 'Page(pageIndex: $pageIndex, chapterName: $chapterName, chapterIndex: $chapterIndex)';
  }
}

// 页面管理
// 双向链表实现的页面管理器
class pageManager {
  // 使用双向链表存储页面
  final DoubleLinkedQueue<Page> _pages = DoubleLinkedQueue<Page>();

  // 当前页面指针
  DoubleLinkedQueueEntry<Page>? _currentEntry;

  // 获取当前页面
  Page? get currentPage => _currentEntry?.element;

  // 检查是否为空
  bool get isEmpty => _pages.isEmpty;

  // 获取页面总数
  int get length => _pages.length;

  // 添加单个页面到队列末尾
  void addPage(Page page) {
    _pages.add(page);
    // 如果这是第一个页面，设置为当前页面
    if (_pages.length == 1) {
      _currentEntry = _pages.firstEntry();
    }
  }

  // 批量添加页面到队列末尾
  void addPages(List<String> pages, String chapterName, int chapterIndex) {
    Page p = Page(0, chapterName, chapterIndex, "");

    for (int i = 0; i < pages.length; i++) {
      p = Page(i, chapterName, chapterIndex, pages[i]);
      addPage(p);
    }
  }

  // 在队列开头添加页面
  void prependPage(Page page) {
    _pages.addFirst(page);
    // 如果这是第一个页面，设置为当前页面
    if (_pages.length == 1) {
      _currentEntry = _pages.firstEntry();
    }
  }

  // 批量在队列开头添加页面
  void prependPages(List<Page> pages) {
    // 逆序添加以保持页面顺序
    for (int i = pages.length - 1; i >= 0; i--) {
      prependPage(pages[i]);
    }
  }

  // 移除并返回队列末尾的页面
  Page? removeLastPage() {
    if (_pages.isEmpty) return null;

    Page removedPage = _pages.removeLast();

    // 如果移除的是当前页面，需要更新当前指针
    if (_currentEntry?.element == removedPage) {
      _currentEntry = _currentEntry?.previousEntry();
      // 如果前面没有页面了，指向下一个页面（如果有的话）
      if (_currentEntry == null) {
        _currentEntry = _pages.isEmpty ? null : _pages.firstEntry();
      }
    }

    return removedPage;
  }

  // 移除并返回队列开头的页面
  Page? removeFirstPage() {
    if (_pages.isEmpty) return null;

    Page removedPage = _pages.removeFirst();

    // 如果移除的是当前页面，需要更新当前指针
    if (_currentEntry?.element == removedPage) {
      _currentEntry = _currentEntry?.nextEntry();
      // 如果后面没有页面了，指向前一个页面（如果有的话）
      if (_currentEntry == null) {
        _currentEntry = _pages.isEmpty ? null : _pages.lastEntry();
      }
    }

    return removedPage;
  }

  // 翻到下一页
  Page? nextPage() {
    if (_currentEntry?.nextEntry() != null) {
      _currentEntry = _currentEntry!.nextEntry();
      return _currentEntry!.element;
    }
    return null; // 已经到最后一页
  }

  // 翻到上一页
  Page? previousPage() {
    if (_currentEntry?.previousEntry() != null) {
      _currentEntry = _currentEntry!.previousEntry();
      return _currentEntry!.element;
    }
    return null; // 已经到第一页
  }

  // 跳转到指定索引的页面
  Page? goToPage(int index) {
    if (index < 0 || index >= _pages.length) return null;

    // 从头开始遍历到目标位置
    var entry = _pages.firstEntry();
    for (int i = 0; i < index && entry != null; i++) {
      entry = entry.nextEntry();
    }

    if (entry != null) {
      _currentEntry = entry;
      return _currentEntry!.element;
    }

    return null;
  }

  // 跳转到指定章节的第一页
  Page? goToChapter(int chapterIndex) {
    var entry = _pages.firstEntry();
    while (entry != null) {
      if (entry.element.chapterIndex == chapterIndex) {
        _currentEntry = entry;
        return _currentEntry!.element;
      }
      entry = entry.nextEntry();
    }
    return null; // 未找到指定章节
  }

  // 清空所有页面
  void clear() {
    _pages.clear();
    _currentEntry = null;
  }

  // 获取所有页面（用于调试）
  List<Page> getAllPages() {
    return _pages.toList();
  }

  // 获取当前页面索引
  int getCurrentPageIndex() {
    if (_currentEntry == null || _pages.isEmpty) return -1;

    int index = 0;
    var entry = _pages.firstEntry();
    while (entry != null && entry != _currentEntry) {
      entry = entry.nextEntry();
      index++;
    }

    return entry != null ? index : -1;
  }
}
